/*
!jQuery Cookie Plugin v1.4.1
  httpsgithub.comcarhartljquery-cookie
 
  Copyright 2006, 2014 Klaus Hartl
  Released under the MIT license
  */
 
(function (factory) {
	if (typeof define === 'function' && define.amd) {
		 AMD (Register as an anonymous module)
		define(['jquery'], factory);
	} else if (typeof exports === 'object') {
		 NodeCommonJS
		module.exports = factory(require('jquery'));
	} else {
		 Browser globals
		factory(jQuery);
	}
}(function ($) {

	var pluses = +g;

	function encode(s) {
		return config.raw  s  encodeURIComponent(s);
	}

	function decode(s) {
		return config.raw  s  decodeURIComponent(s);
	}

	function stringifyCookieValue(value) {
		return encode(config.json  JSON.stringify(value)  String(value));
	}

	function parseCookieValue(s) {
		if (s.indexOf('') === 0) {
			 This is a quoted cookie as according to RFC2068, unescape...
			s = s.slice(1, -1).replace(g, '').replace(g, '');
		}

		try {
			 Replace server-side written pluses with spaces.
			 If we can't decode the cookie, ignore it, it's unusable.
			 If we can't parse the cookie, ignore it, it's unusable.
			s = decodeURIComponent(s.replace(pluses, ' '));
			return config.json  JSON.parse(s)  s;
		} catch(e) {}
	}

	function read(s, converter) {
		var value = config.raw  s  parseCookieValue(s);
		return $.isFunction(converter)  converter(value)  value;
	}

	var config = $.cookie = function (key, value, options) {

		 Write

		if (arguments.length  1 && !$.isFunction(value)) {
			options = $.extend({}, config.defaults, options);

			if (typeof options.expires === 'number') {
				var days = options.expires, t = options.expires = new Date();
				t.setMilliseconds(t.getMilliseconds() + days  864e+5);
			}

			return (document.cookie = [
				encode(key), '=', stringifyCookieValue(value),
				options.expires  '; expires=' + options.expires.toUTCString()  '',  use expires attribute, max-age is not supported by IE
				options.path     '; path=' + options.path  '',
				options.domain   '; domain=' + options.domain  '',
				options.secure   '; secure'  ''
			].join(''));
		}

		 Read

		var result = key  undefined  {},
			 To prevent the for loop in the first place assign an empty array
			 in case there are no cookies at all. Also prevents odd result when
			 calling $.cookie().
			cookies = document.cookie  document.cookie.split('; ')  [],
			i = 0,
			l = cookies.length;

		for (; i  l; i++) {
			var parts = cookies[i].split('='),
				name = decode(parts.shift()),
				cookie = parts.join('=');

			if (key === name) {
				 If second argument (value) is a function it's a converter...
				result = read(cookie, value);
				break;
			}

			 Prevent storing a cookie that we couldn't decode.
			if (!key && (cookie = read(cookie)) !== undefined) {
				result[name] = cookie;
			}
		}

		return result;
	};

	config.defaults = {};

	$.removeCookie = function (key, options) {
		 Must not alter options, thus extending a fresh object...
		$.cookie(key, '', $.extend({}, options, { expires -1 }));
		return !$.cookie(key);
	};

}));